home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / xarchie-2.0.9 / selection.c < prev    next >
C/C++ Source or Header  |  1995-06-18  |  5KB  |  232 lines

  1. /*
  2.  * selection.c : Code that the X and Curses browsers use, but that
  3.  *    others might be able to do without, or do better.
  4.  *
  5.  * Note that we need to maintain the selections for those levels
  6.  * of the browser that aren't displayed right now. Again, you may
  7.  * get better mileage from your window system.
  8.  *
  9.  * George Ferguson, ferguson@cs.rochester.edu, 23 Apr 1993.
  10.  * 13 May 1993: Store selections in order they're made.
  11.  */
  12. #include <stdio.h>
  13. #include "xtypes.h"
  14. #include "sysdefs.h"
  15. #include "db.h"
  16. #include "display.h"
  17. #include "browser.h"
  18. #include "selection.h"
  19. #include "debug.h"
  20.  
  21. /*
  22.  * Functions defined here:
  23.  */
  24. void resetSelections();
  25. void redrawSelectionsForPane(),resetSelectionsForPane();
  26. void addSelection(),addSelectionInPane(),removeSelection();
  27. SelectedItem *getSelection();
  28. Boolean isSelected(),isSelectedInPane();
  29. Boolean hasSelection(),hasSelectionInPane();
  30. void forEachSelectedItemAtDepth(),forEachSelectedItem();
  31.  
  32. /*
  33.  * Data defined here:
  34.  */
  35. static SelectedItem *selectedItems[MAX_DEPTH];
  36. static int deepest;
  37.  
  38. /*    -    -    -    -    -    -    -    -    */
  39.  
  40. void
  41. resetSelections(depth)
  42. int depth;
  43. {
  44.     SelectedItem *item,*nextItem;
  45.     int i;
  46.  
  47.     DEBUG1("clearing selections for depth >= %d\n",depth);
  48.     for (i=depth; i < MAX_DEPTH; i++) {
  49.     for (item=selectedItems[i]; item != NULL; item = nextItem) {
  50.         nextItem = item->next;
  51.         XtFree((char *)item);
  52.     }
  53.     selectedItems[i] = NULL;
  54.     }
  55.     deepest = depth-1;
  56.     DEBUG1("deepest now = %d\n",deepest);
  57. }
  58.  
  59. void
  60. redrawSelectionsForPane(pane)
  61. int pane;
  62. {
  63.     SelectedItem *item;
  64.  
  65.     DEBUG1("redrawing selections for pane %d\n",pane);
  66.     for (item=selectedItems[paneDepth(pane)]; item != NULL;
  67.      item=item->next) {
  68.     highlightBrowserItem(pane,item->list_index);
  69.     }
  70. }
  71.  
  72. void
  73. resetSelectionsForPane(pane)
  74. int pane;
  75. {
  76.     DEBUG1("clearing selections for pane %d\n",pane);
  77.     resetSelections(paneDepth(pane));
  78. }
  79.  
  80. /*    -    -    -    -    -    -    -    -    */
  81.  
  82. void
  83. addSelection(depth,dbp,list_index)
  84. int depth;
  85. DbEntry *dbp;
  86. int list_index;
  87. {
  88.     SelectedItem *last;
  89.  
  90.     DEBUG3("adding selection \"%s\"(0x%x) at depth %d\n",dbp->name,dbp,depth);
  91.     if (selectedItems[depth] == NULL) {
  92.     selectedItems[depth] = XtNew(SelectedItem);
  93.     selectedItems[depth]->prev = NULL;
  94.     selectedItems[depth]->next = NULL;
  95.     last = selectedItems[depth];
  96.     } else {
  97.     for (last=selectedItems[depth]; last->next != NULL; last=last->next)
  98.         /*EMPTY*/;
  99.     last->next = XtNew(SelectedItem);
  100.     last->next->prev = last;
  101.     last->next->next = NULL;
  102.     last = last->next;
  103.     }
  104.     last->entry = dbp;
  105.     last->list_index = list_index;
  106.     dbp->selected = depth;
  107.     if (depth > deepest) {
  108.     deepest = depth;
  109.     DEBUG1("deepest now = %d\n",deepest);
  110.     }
  111. }
  112.  
  113. void
  114. addSelectionInPane(pane,dbp,list_index)
  115. int pane;
  116. DbEntry *dbp;
  117. int list_index;
  118. {
  119.     DEBUG3("adding selection \"%s\"(0x%x) in pane %d\n",dbp->name,dbp,pane);
  120.     addSelection(paneDepth(pane),dbp,list_index);
  121. }
  122.  
  123. void
  124. removeSelection(depth,dbp,list_index)
  125. int depth;
  126. DbEntry *dbp;
  127. int list_index;
  128. {
  129.     SelectedItem *item;
  130.  
  131.     DEBUG3("removing selection \"%s\"(0x%x) at depth %d\n",
  132.        (dbp?dbp->name:"<NIL>"),dbp,depth);
  133.     for (item=selectedItems[depth]; item != NULL; item = item->next)
  134.     if ((dbp == NULL || item->entry == dbp) &&
  135.         (list_index == -1  || item->list_index == list_index))
  136.         break;
  137.     if (item == NULL) {
  138.     fprintf(stderr,"removeSelection: Can't find entry 0x%x (list_index=%d) at depth %d\n",dbp,list_index,depth);
  139.     return;
  140.     }
  141.     if (item == selectedItems[depth]) {
  142.     selectedItems[depth] = item->next;
  143.     if (item->next != NULL)
  144.         item->next->prev = NULL;
  145.     } else {
  146.     item->prev->next = item->next;
  147.     if (item->next != NULL)
  148.         item->next->prev = item->prev;
  149.     }
  150.     XtFree((char *)item);
  151.     if (selectedItems[depth] == NULL) {
  152.     deepest = depth-1;
  153.     DEBUG1("deepest now = %d\n",deepest);
  154.     }
  155. }
  156.  
  157. SelectedItem *
  158. getSelection(depth)
  159. int depth;
  160. {
  161.     return(selectedItems[depth]);
  162. }
  163.  
  164. /*    -    -    -    -    -    -    -    -    */
  165.  
  166. Boolean
  167. isSelected(depth,list_index)
  168. int depth,list_index;
  169. {
  170.     SelectedItem *item;
  171.  
  172.     for (item=selectedItems[depth];
  173.      item != NULL && item->list_index != list_index; item=item->next)
  174.     /*EMPTY*/;
  175.     return(item != NULL);
  176. }
  177.  
  178. Boolean
  179. isSelectedInPane(pane,list_index)
  180. int pane,list_index;
  181. {
  182.     return(isSelected(paneDepth(pane),list_index));
  183. }
  184.  
  185. Boolean
  186. hasSelection(depth)
  187. int depth;
  188. {
  189.     return(selectedItems[depth] != NULL);
  190. }
  191.  
  192. Boolean
  193. hasSelectionInPane(pane)
  194. int pane;
  195. {
  196.     return(hasSelection(paneDepth(pane)));
  197. }
  198.  
  199. /*    -    -    -    -    -    -    -    -    */
  200. /*
  201.  * Calls "func" for each selected item at depth "depth", passing DbEntry
  202.  * and list_index.
  203.  */
  204. void
  205. forEachSelectedItemAtDepth(depth,func)
  206. int depth;
  207. void (*func)();
  208. {
  209.     SelectedItem *item;
  210.  
  211.     for (item=selectedItems[depth]; item != NULL; item=item->next)
  212.     (*func)(item->entry,item->list_index);
  213. }
  214.  
  215. /*
  216.  * Like above, but calls "func" for each item selected at the deepest
  217.  * level.
  218.  */
  219. void
  220. forEachSelectedItem(func)
  221. void (*func)();
  222. {
  223.     SelectedItem *item;
  224.  
  225.     if (deepest == -1) {
  226.     DEBUG0("forEachSelectedItem: nothing selected\n");
  227.        return;
  228.     }
  229.     for (item=selectedItems[deepest]; item != NULL; item=item->next)
  230.     (*func)(item->entry,item->list_index);
  231. }
  232.